{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 策略组合优化"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. 查看所有待优化策略组合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xcca3130>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th>name</th>\n",
       "      <th>JJ for ag</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2015-10-08</th>\n",
       "      <td>-0.005348</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-10-13</th>\n",
       "      <td>-0.006692</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-10-23</th>\n",
       "      <td>-0.008037</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-10-28</th>\n",
       "      <td>0.008617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-10-29</th>\n",
       "      <td>-0.024731</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-11-03</th>\n",
       "      <td>-0.028067</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-11-06</th>\n",
       "      <td>-0.022396</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-11-10</th>\n",
       "      <td>-0.029722</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-11-12</th>\n",
       "      <td>-0.042048</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-11-16</th>\n",
       "      <td>-0.060381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-11-17</th>\n",
       "      <td>-0.064709</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-11-19</th>\n",
       "      <td>-0.073039</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-11-23</th>\n",
       "      <td>-0.047362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-12-01</th>\n",
       "      <td>-0.053685</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-12-07</th>\n",
       "      <td>-0.044016</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-12-08</th>\n",
       "      <td>-0.046343</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-12-09</th>\n",
       "      <td>-0.044673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-12-11</th>\n",
       "      <td>-0.049999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-12-16</th>\n",
       "      <td>-0.050326</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2015-12-28</th>\n",
       "      <td>-0.054657</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "name        JJ for ag\n",
       "date                 \n",
       "2015-10-08  -0.005348\n",
       "2015-10-13  -0.006692\n",
       "2015-10-23  -0.008037\n",
       "2015-10-28   0.008617\n",
       "2015-10-29  -0.024731\n",
       "2015-11-03  -0.028067\n",
       "2015-11-06  -0.022396\n",
       "2015-11-10  -0.029722\n",
       "2015-11-12  -0.042048\n",
       "2015-11-16  -0.060381\n",
       "2015-11-17  -0.064709\n",
       "2015-11-19  -0.073039\n",
       "2015-11-23  -0.047362\n",
       "2015-12-01  -0.053685\n",
       "2015-12-07  -0.044016\n",
       "2015-12-08  -0.046343\n",
       "2015-12-09  -0.044673\n",
       "2015-12-11  -0.049999\n",
       "2015-12-16  -0.050326\n",
       "2015-12-28  -0.054657"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从数据库获得价差数据\n",
    "from vtFunction import *\n",
    "from ctaBase import *\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "fields = ['name','date','pnl']\n",
    "strategyNames = ['JJ for ag']\n",
    "strategyBases = [10000]\n",
    "plt.close()\n",
    "startDate = '20151001'\n",
    "endDate = '20161030'\n",
    "rtns = pd.DataFrame()\n",
    "caps = pd.DataFrame()\n",
    "for name,base in zip(strategyNames,strategyBases):\n",
    "    datas = loadStrategyData(CAP_DB_NAME,name,startDate,endDate,fields)\n",
    "    datas['pnl']=datas['pnl']/base\n",
    "    rtns = pd.concat([rtns,datas],axis = 0)\n",
    "    datas=datas.set_index('date')\n",
    "    datas['cap']=datas.apply(np.cumsum)['pnl']\n",
    "    datas.plot(kind='line',title = name)\n",
    "    datas.reset_index(drop=False,inplace=True)\n",
    "    caps = pd.concat([caps,datas],axis = 0)\n",
    "rtn_table = pd.crosstab(rtns['date'],rtns['name'], values = rtns['pnl'], aggfunc = sum)  #  一维表变为二维表\n",
    "rtn_table.fillna(0, inplace = True)  #  将NaN置换为0\n",
    "cap_table = pd.crosstab(caps['date'],caps['name'], values = caps['cap'], aggfunc = sum)  #  一维表变为二维表\n",
    "cap_table.fillna(method='pad', inplace = True)  #  将NaN置换为0\n",
    "cap_table.fillna(0, inplace = True)  #  将NaN置换为0\n",
    "plt.show()\n",
    "cap_table.head(20)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 计算协方差矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'rtn_table' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-2-6b03a6f24db9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[1;32mprint\u001b[0m \u001b[0mrtn_table\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m250\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[1;32mprint\u001b[0m \u001b[0mrtn_table\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstd\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m250\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mrtn_table\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcorr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'rtn_table' is not defined"
     ]
    }
   ],
   "source": [
    "print rtn_table.mean() * 250\n",
    "print rtn_table.std() * np.sqrt(250)\n",
    "rtn_table.corr()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 计算风险收益曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'rtn_table' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-2-5e6b4c4f04a3>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mportfolio1\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mcov_mat\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrtn_table\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcov\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m250\u001b[0m   \u001b[1;31m# 协方差矩阵\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      5\u001b[0m \u001b[0mexp_rtn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrtn_table\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m250\u001b[0m   \u001b[1;31m# 标的预期收益\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'rtn_table' is not defined"
     ]
    }
   ],
   "source": [
    "from cvxopt import matrix, solvers\n",
    "\n",
    "portfolio1 = [0,1,2,3,4,5]\n",
    "cov_mat = rtn_table.cov() * 250   # 协方差矩阵\n",
    "exp_rtn = rtn_table.mean() * 250   # 标的预期收益\n",
    "\n",
    "def cal_efficient_frontier(portfolio): \n",
    "    #简单的容错处理\n",
    "    if len(portfolio) <= 2 or len(portfolio) > 7:\n",
    "        raise Exception('portfolio必须为长度大于2小于7的list！') \n",
    "    # 数据准备\n",
    "    cov_mat1 = cov_mat.iloc[portfolio][portfolio]\n",
    "    exp_rtn1 = exp_rtn.iloc[portfolio]\n",
    "    max_rtn = max(exp_rtn1)\n",
    "    min_rtn = min(exp_rtn1)\n",
    "    risks = [] \n",
    "    returns = []\n",
    "    # 均匀选取20个点来作图\n",
    "    for level_rtn in np.linspace(min_rtn, max_rtn, 20):   \n",
    "        sec_num = len(portfolio)\n",
    "        P = 2*matrix(cov_mat1.values)\n",
    "        q = matrix(np.zeros(sec_num))\n",
    "        G = matrix(np.diag(-1 * np.ones(sec_num)))\n",
    "        h = matrix(0.0, (sec_num,1))\n",
    "        A = matrix(np.matrix([np.ones(sec_num),exp_rtn1.values]))\n",
    "        b = matrix([1.0,level_rtn])\n",
    "        solvers.options['show_progress'] = False\n",
    "        sol = solvers.qp(P,q, G, h, A, b)\n",
    "        risks.append(sol['primal objective'])\n",
    "        returns.append(level_rtn)\n",
    "    return np.sqrt(risks), returns\n",
    "\n",
    "#  计算画图数据\n",
    "risk1, return1 = cal_efficient_frontier(portfolio1)\n",
    "plt.close()\n",
    "fig = plt.figure(figsize = (14,8))\n",
    "ax1 = fig.add_subplot(111)\n",
    "ax1.plot(risk1,return1)\n",
    "ax1.set_title('Efficient  Frontier', fontsize = 14)\n",
    "ax1.set_xlabel('Standard  Deviation', fontsize = 12)\n",
    "ax1.set_ylabel('Expected  Return', fontsize = 12)\n",
    "ax1.tick_params(labelsize = 12)\n",
    "ax1.legend(['portfolio1'], loc = 'best', fontsize = 14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.给定风险厌恶系数，确定每个策略的资金分配"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'matrix' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-3-95ff25438072>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mrisk_aversion\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m90\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mP\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrisk_aversion\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mmatrix\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcov_mat\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0mq\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mmatrix\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexp_rtn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mG\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmatrix\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvstack\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdiag\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mones\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexp_rtn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdiag\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mones\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexp_rtn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mh\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmatrix\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mones\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexp_rtn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexp_rtn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mexp_rtn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'matrix' is not defined"
     ]
    }
   ],
   "source": [
    "risk_aversion = 90\n",
    "P = risk_aversion * matrix(cov_mat.values)\n",
    "q = -1 * matrix(exp_rtn.values)\n",
    "G = matrix(np.vstack((np.diag(np.ones(len(exp_rtn))),np.diag(-np.ones(len(exp_rtn))))))\n",
    "h = matrix(np.array([np.ones(len(exp_rtn)),np.zeros(len(exp_rtn))]).reshape(len(exp_rtn)*2,1))\n",
    "A = matrix(np.ones(len(exp_rtn)),(1,len(exp_rtn)))\n",
    "b = matrix([1.0])\n",
    "solvers.options['show_progress'] = False\n",
    "sol = solvers.qp(P,q, G, h, A, b)\n",
    "weis=pd.DataFrame(index=exp_rtn.index,data = np.round(sol['x'],2), columns = ['weight'])  # 权重精确到小数点后两位\n",
    "weis"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.策略组合的资金曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'cap_table' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-4-5022ea8c57b6>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'zh'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name1'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;36m0.28\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name2'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;36m0.37\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name3'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;36m0.07\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name4'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;36m0.24\u001b[0m\u001b[1;33m+\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name5'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;36m0.04\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      3\u001b[0m \u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'zh'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mcap_array\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmatrix\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name1'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name2'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name3'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name4'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mcap_table\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'name5'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0mwei_array\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmatrix\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0.22\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0.44\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0.14\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0.12\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m0.08\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mNameError\u001b[0m: name 'cap_table' is not defined"
     ]
    }
   ],
   "source": [
    "plt.close()\n",
    "cap_table['zh']=1+cap_table['name1']*0.28+cap_table['name2']*0.37+cap_table['name3']*0.07+cap_table['name4']*0.24+cap_table['name5']*0.04\n",
    "cap_table['zh'].plot()\n",
    "cap_array=np.matrix([cap_table['name1'],cap_table['name2'],cap_table['name3'],cap_table['name4'],cap_table['name5']])\n",
    "wei_array=np.matrix([0.22,0.44,0.14,0.12,0.08])\n",
    "print cap_array\n",
    "cap_table['zh']=1+np.matrix.dot(cap_array.T,wei_array.T)\n",
    "cap_table['zh'].plot()\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
